#include <iostream>
#include <unordered_map>
#include <gtest/gtest.h>


//TestSuite:测试套件/集合进行单元测试,即,将多个相关测试归入一组的方式进行测试,为这组测试用例进行环境配置和清理
//概念: 对一个功能的验证往往需要很多测试用例，测试套件就是针对一组相关测试用例进行环境配置的事件机制
//用法: 先定义环境类,继承于 testing::Test 基类, 重写两个静态函数

class MySuiteTest: public testing::Test
{
public:
    // 对整个单元测试套件仅会调用一次
    static void SetUpTestCase()
    {
        std::cout << "所有单元测试前执行，初始化总环境 -- SetUpTestCase() is called\n";
    }
    static void TearDownTestCase()
    {
        std::cout << "所有单元测试结束后执行，清理总环境 -- TearDownTestCase() is called\n";
    }

    
    // 对于每个测试用例都会在开始和结束时调用
    virtual void SetUp() override
    {
        std::cout << "SetUp() is called\n";
        map.insert({1, "苹果"});
        map.insert({2, "香蕉"});
    }
    virtual void TearDown() override
    {
        std::cout << "TearDown() is called\n";
        map.clear();
    }

public:
    std::unordered_map<int, std::string> map;
};

// test_find与test_size之间不会互相影响
TEST_F(MySuiteTest, test_find)
{
    auto iter = map.find(2);
    ASSERT_EQ(iter->second, "香蕉");
    map.insert({3, "梨"});
}

TEST_F(MySuiteTest, test_size)
{
    EXPECT_EQ(map.size(), 2);
    map.insert({10, "哈密瓜"});
}

int main(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc, argv);
    RUN_ALL_TESTS();
    return 0;
}